package com.swak.lambda;

/**
 * lambda 的 原理： LambdaTest
 * 
 * @author lifeng
 */
public class LambdaTest_theory {

	public void testPrint(String text, Print print) {
		print.handle(text);
	}

	public static void main(String[] args) {
		String say = "Say:";
		LambdaTest_theory lambdaTest = new LambdaTest_theory();

		/**
		 * 这块代码的具体转换方式，但是需要注意的是，lambda 是在运行时自动转换。<br>
		 * 每次执行都会创建接口子类对象作为参数传递。 <br>
		 * 子类对象中持有了外观方法中变量的引用,作为成员变量。 <br>
		 */
		// lambdaTest.testPrint("I am Lambda One!", (t) -> {
		// System.out.println(say + t);
		// });
		lambdaTest.testPrint("I am Lambda One!", LambdaTest_theory$$Lambda$1.get$Lambda(say));

		// 下面这块也是重新生成了一个子类，类似上面你的方法
		lambdaTest.testPrint("I am Lambda Two!", (t) -> {
			System.out.println(say + t);
		});
	}

	/**
	 * 动态生成的代码，封装了lambda 中的代码，注意参数： lambda 中需要使用的参数在这里都作为形参。
	 * 
	 * @param t1
	 * @param t2
	 */
	static void lambda$0(java.lang.String t1, java.lang.String t2) {
		System.out.println(t1 + t2);
	}

	// private static void lambda$1(java.lang.String t1, java.lang.String t2) {
	// System.out.println(t1 + t2);
	// }

	@FunctionalInterface
	public interface Print {
		void handle(String text);
	}
}

/**
 * 自动生成的子类，注意构造方法，以及对接口的实现方法。
 * 
 * @author lifeng
 */
final class LambdaTest_theory$$Lambda$1 implements com.swak.lambda.LambdaTest_theory.Print {

	private final java.lang.String arg$1;

	private LambdaTest_theory$$Lambda$1(java.lang.String arg$1) {
		this.arg$1 = arg$1;
	}

	static LambdaTest_theory$$Lambda$1 get$Lambda(java.lang.String arg$1) {
		return new LambdaTest_theory$$Lambda$1(arg$1);
	}

	@Override
	public void handle(String text) {
		LambdaTest_theory.lambda$0(arg$1, text);
	}
}
